<?php
/**
 * 职位控制器
 * 负责职位相关的CRUD操作
 */

declare(strict_types=1);

namespace app\controller\user;

use app\BaseController;
use think\facade\Db;
use think\facade\Request;
use think\response\Json;

class Position extends BaseController
{
    /**
     * 默认分页页码
     * @var int
     */
    protected $defaultPage = 1;

    /**
     * 默认每页数量
     * @var int
     */
    protected $defaultLimit = 15;

    /**
     * 最大每页数量
     * @var int
     */
    protected $maxLimit = 100;

    /**
     * 获取职位列表
     * GET /api/user/position/list
     */
    public function index(): Json
    {
        try {
            $param = Request::param();
            $page = (int)($param['page'] ?? 1);
            $limit = (int)($param['limit'] ?? 10);
            
            $where = [];
            $where[] = ['status', '>', 0];
            
            // 按职位名称筛选
            if (!empty($param['title'])) {
                $where[] = ['title', 'like', '%' . $param['title'] . '%'];
            }
            
            // 获取职位列表
            $list = Db::name('position')
                ->where($where)
                ->page($page, $limit)
                ->order('id', 'asc')
                ->select()
                ->toArray();

            // 获取总数
            $count = Db::name('position')
                ->where($where)
                ->count();

            // 处理职位列表，添加角色组名称和用户数量
            foreach ($list as &$position) {
                // 获取角色组名称 - 通过关联表 oa_position_group 查询
                $groupIds = Db::name('position_group')
                    ->where('pid', $position['id'])  // 使用 'pid' 字段
                    ->column('group_id');

                if (!empty($groupIds)) {
                    // 通过角色组ID查询角色组名称
                    $groupNames = Db::name('admin_group')
                        ->where('id', 'in', $groupIds)
                        ->where('status', '>=', 0)
                        ->column('title');
                    $position['group_names'] = implode(',', $groupNames);
                } else {
                    $position['group_names'] = '';
                }

                // 统计该职位的用户数量
                $position['user_count'] = Db::name('admin')
                    ->where('position_id', $position['id'])
                    ->where('status', '>=', 0)
                    ->count();
            }

            return json([
                'code' => 0,
                'msg' => '获取职位列表成功',
                'data' => [
                    'list' => $list,
                    'total' => $count,
                    'page' => $page,
                    'limit' => $limit
                ],
                'timestamp' => time()
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '获取职位列表失败: ' . $e->getMessage(), 'timestamp' => time()]);
        }
    }
    
    /**
     * 查看单个职位详情
     * GET /api/user/position/show
     */
    public function show(): Json
    {
        try {
            $param = Request::param();
            $id = (int)($param['id'] ?? 0);
            
            if ($id <= 0) {
                return json(['code' => 400, 'msg' => '职位ID不能为空', 'timestamp' => time()]);
            }
            
            $position = Db::name('position')
                ->where('id', $id)
                ->where('status', '>', 0)
                ->find();
            
            if (!$position) {
                return json(['code' => 404, 'msg' => '职位不存在', 'timestamp' => time()]);
            }
            
            // 获取角色组关联信息
            $groupIds = Db::name('position_group')
                ->where('pid', $position['id'])  // 使用 'pid' 字段
                ->column('group_id');
            
            // 将关联的角色组ID添加到返回数据中
            $position['group_id'] = $groupIds;
            
            return json([
                'code' => 0,
                'msg' => '获取职位信息成功',
                'data' => $position,
                'timestamp' => time()
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '获取职位信息失败: ' . $e->getMessage(), 'timestamp' => time()]);
        }
    }
    
    /**
     * 获取职位选项（用于下拉选择）
     * GET /api/user/position/options
     */
    public function options(): Json
    {
        try {
            // 获取所有启用的职位
            $list = Db::name('position')
                ->where('status', 1)
                ->field('id, title')
                ->order('id', 'asc')
                ->select()
                ->toArray();
            
            return json([
                'code' => 0,
                'msg' => '获取职位选项成功',
                'data' => [
                    'list' => $list
                ],
                'timestamp' => time()
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '获取职位选项失败: ' . $e->getMessage(), 'timestamp' => time()]);
        }
    }
    
    /**
     * 创建职位
     * POST /api/user/position/store
     */
    public function store(): Json
    {
        try {
            $param = Request::param();

            // 数据验证
            if (empty($param['title'])) {
                return json(['code' => 400, 'msg' => '职位名称不能为空', 'timestamp' => time()]);
            }

            $data = [
                'title' => $param['title'],
                'remark' => $param['remark'] ?? '',
                'status' => (int)($param['status'] ?? 1),
                'create_time' => time(),
                'update_time' => time()
            ];

            // 检查职位名称是否已存在
            $existing = Db::name('position')
                ->where('title', $param['title'])
                ->where('status', '>', 0)
                ->find();

            if ($existing) {
                return json(['code' => 422, 'msg' => '职位名称已存在', 'timestamp' => time()]);
            }

            $positionId = Db::name('position')->insertGetId($data);

            // 处理角色组关联
            if (!empty($param['group_id'])) {
                $groupIds = is_string($param['group_id'])
                    ? explode(',', $param['group_id'])
                    : (array)$param['group_id'];
                $groupIds = array_filter(array_map('intval', $groupIds));

                // 先删除旧关联
                Db::name('position_group')->where('pid', $positionId)->delete();

                // 添加新关联
                $positionGroups = [];
                foreach ($groupIds as $groupId) {
                    if ($groupId > 0) {
                        $positionGroups[] = [
                            'pid' => $positionId,
                            'group_id' => $groupId,
                            'create_time' => time(),
                            'update_time' => time()
                        ];
                    }
                }

                if (!empty($positionGroups)) {
                    Db::name('position_group')->insertAll($positionGroups);
                }
            }

            return json([
                'code' => 0,
                'msg' => '创建职位成功',
                'data' => ['id' => $positionId],
                'timestamp' => time()
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '创建职位失败: ' . $e->getMessage(), 'timestamp' => time()]);
        }
    }
    
    /**
     * 更新职位
     * PUT /api/user/position/update
     */
    public function update(): Json
    {
        try {
            $param = Request::param();
            $id = (int)($param['id'] ?? 0);

            if ($id <= 0) {
                return json(['code' => 400, 'msg' => '职位ID不能为空', 'timestamp' => time()]);
            }

            // 数据验证
            if (empty($param['title'])) {
                return json(['code' => 400, 'msg' => '职位名称不能为空', 'timestamp' => time()]);
            }

            $position = Db::name('position')
                ->where('id', $id)
                ->where('status', '>', 0)
                ->find();

            if (!$position) {
                return json(['code' => 404, 'msg' => '职位不存在', 'timestamp' => time()]);
            }

            $data = [
                'title' => $param['title'],
                'remark' => $param['remark'] ?? '',
                'status' => (int)($param['status'] ?? 1),
                'update_time' => time()
            ];

            // 检查职位名称是否已存在（排除当前职位）
            $existing = Db::name('position')
                ->where('title', $param['title'])
                ->where('id', '<>', $id)
                ->where('status', '>', 0)
                ->find();

            if ($existing) {
                return json(['code' => 422, 'msg' => '职位名称已存在', 'timestamp' => time()]);
            }

            Db::name('position')->where('id', $id)->update($data);

            // 处理角色组关联
            if (array_key_exists('group_id', $param)) {
                $groupIds = [];
                if (!empty($param['group_id'])) {
                    $groupIds = is_string($param['group_id'])
                        ? explode(',', $param['group_id'])
                        : (array)$param['group_id'];
                    $groupIds = array_filter(array_map('intval', $groupIds));
                }

                // 先删除旧关联
                Db::name('position_group')->where('pid', $id)->delete();

                // 添加新关联
                if (!empty($groupIds)) {
                    $positionGroups = [];
                    foreach ($groupIds as $groupId) {
                        if ($groupId > 0) {
                            $positionGroups[] = [
                                'pid' => $id,
                                'group_id' => $groupId,
                                'create_time' => time(),
                                'update_time' => time()
                            ];
                        }
                    }

                    if (!empty($positionGroups)) {
                        Db::name('position_group')->insertAll($positionGroups);
                    }
                }
            }

            return json([
                'code' => 0,
                'msg' => '更新职位成功',
                'timestamp' => time()
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '更新职位失败: ' . $e->getMessage(), 'timestamp' => time()]);
        }
    }
    
    /**
     * 删除职位
     * DELETE /api/user/position/destroy
     */
    public function destroy(): Json
    {
        try {
            $param = Request::param();
            $id = (int)($param['id'] ?? 0);

            if ($id <= 0) {
                return json(['code' => 400, 'msg' => '职位ID不能为空', 'timestamp' => time()]);
            }

            $position = Db::name('position')
                ->where('id', $id)
                ->where('status', '>', 0)
                ->find();

            if (!$position) {
                return json(['code' => 404, 'msg' => '职位不存在', 'timestamp' => time()]);
            }

            // 检查是否有员工使用此职位
            $adminCount = Db::name('admin')
                ->where('position_id', $id)
                ->where('status', '>=', 0)
                ->count();

            if ($adminCount > 0) {
                return json(['code' => 422, 'msg' => '该职位已被员工使用，无法删除', 'timestamp' => time()]);
            }

            // 先删除角色组关联
            Db::name('position_group')->where('pid', $id)->delete();

            // 软删除
            Db::name('position')->where('id', $id)->update([
                'status' => -1,
                'update_time' => time()
            ]);

            return json([
                'code' => 0,
                'msg' => '删除职位成功',
                'timestamp' => time()
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '删除职位失败: ' . $e->getMessage(), 'timestamp' => time()]);
        }
    }
}